<?php
/**
 * Класс модель сообщений гостевой книги
 */
class Application_Model_Gb {

	protected $id = null;
	protected $path = null;
	protected $text = null;
	protected $date = null;

	/**
	 * Конструктор переданным массивом заполняем поля
	 * @param array $data
	 * @return Application_Model_Gb
	 */
	public function __constructor(array $data) {
		$vars = get_class_vars(get_class($this));

		foreach ($vars as $key => $var) {
			if (array_key_exists($key, $data)) {
				$this->set{ucfirst($key)}($data[$key]);
			}
		}
		return $this;
	}

	/**
	 * Магический метод __call
	 * реализует get|set методы для полей класса
	 * @param string $name
	 * @param string $args
	 * @return Application_Model_Gb
	 */
	public function __call($name, $args) {
		if (preg_match('/^(get|set)(\w+)/', strtolower($name), $match) && $attribute = $this->validateAttribute($match[2])) {
			if ('get' == $match[1]) {
				return $this->$attribute;
			} else if ('id' != $attribute) {
				$this->$attribute = $args[0];
				return $this;
			}
		} else {
			throw new Exception('Call to undefined method ' . get_class() . '::' . $name . '()');
		}
	}

	/**
	 * Проверяет $name на соответствие с названием полей класса,
	 * затем возвращает строку в нижнем регистре
	 * @param string $name
	 * @return string
	 */
	protected function validateAttribute($name) {
		if (in_array(strtolower($name), array_keys(get_class_vars(get_class($this))))) {
			return strtolower($name);
		}
	}

	/**
	 * Возвращает поля обьекта в виде асоциативного массива
	 * @return array
	 */
	public function toArray() {
		$vars = get_object_vars($this);
		$data = array();
		foreach ($vars as $name => $value) {
			$data[$name] = $value;
		}
		return $data;
	}

}